#include "mycanvas.h"
#include <muParser.h>
#include "fourier.h"
#include "math.h"

MyCanvas::MyCanvas(QWidget *parent) :
    QWidget(parent)
{
    this->funcion=NULL;
    this->pinto=false;
}

void MyCanvas::paintEvent(QPaintEvent* pEvent)
{
    QPainter painter(this);
    QSize size = this->size();
    painter.fillRect(0,0,size.width(), size.height(), Qt::black);
    if (pinto){
        pintarFuncion();
    }
}

void MyCanvas::pintarFuncion()
{
    QPainter painter(this);
    painter.setPen(Qt::blue);
    for(int i=1;i<this->size().width();i++)
    {
        double x1=this->x_funcion(i-1, &this->size());
        //qDebug("%f", x1);
        double x2=this->x_funcion(i,&this->size());

        double y1=this->funcion->evaluar(x1);
        double y2=this->funcion->evaluar(x2);
        //qDebug("%f", y1);
        //double y1=cos(x1);
        //        double y2=cos(x2);
        int nx1=this->x_canvas(x1, &this->size());
        int ny1=this->y_canvas(y1, &this->size());
        int nx2=this->x_canvas(x2, &this->size());
        int ny2=this->y_canvas(y2, &this->size());

        painter.drawLine(nx1,ny1, nx2,ny2);
    }
}


int MyCanvas::x_canvas(double coordenada, QSize* size)
{
    double nuevox=this->cambiarSistemaCoordenadas(coordenada, this->x_cotainferior, this->x_cotasuperior, 0, size->width());
    //return (int)nuevox+size->width()/2;
    return (int)nuevox;
}

int MyCanvas::y_canvas(double coordenada, QSize* size)
{
    double nuevoy=this->cambiarSistemaCoordenadas(coordenada, this->y_cotainferior, this->y_cotasuperior, size->height(), 0);
    //return (int)-nuevoy+size->height()/2;
    return (int)nuevoy;
}


double MyCanvas::x_funcion(int coordenada, QSize* size)
{
    //coordenada=coordenada-size->width()/2;
    double x=this->cambiarSistemaCoordenadas(coordenada,0, size->width(), this->x_cotainferior, this->x_cotasuperior);
    return x;
}

double MyCanvas::y_funcion(int coordenada, QSize* size)
{
    //coordenada=-coordenada+size->height()/2;
    double y=this->cambiarSistemaCoordenadas(coordenada,size->width(), 0, this->x_cotainferior, this->x_cotasuperior);
    return y;
}

double MyCanvas::cambiarSistemaCoordenadas(double coordenada, double cotainferiorvieja, double cotasuperiorvieja, double cotainferiornueva, double cotasuperiornueva)
{
    double a=cotainferiorvieja;
    double b=cotasuperiorvieja;
    double ap=cotainferiornueva;
    double bp=cotasuperiornueva;
    double resultado=ap+(coordenada-a)*(bp-ap)/(b-a);
    return resultado;

}
